package com.lancoo.edu.platform.operation.commons.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.lancoo.edu.platform.operation.commons.domain.bo.MonthInfoBo;
import com.lancoo.edu.platform.operation.commons.domain.bo.WeekInfoBo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 关于时间的工具类
 * @author lzh
 */
public class DateUtils {

    /**
     * 判断日程开始时间是否是将来
     * @param nowTime 现在时间
     * @param scheduleDate 日程日期
     * @param startTime 日程开始时间
     * @return true/false
     */
    public static boolean judeIsFutureTime(Date scheduleDate, String startTime , Date nowTime){
        String date = DateUtil.format(scheduleDate,"yyyy-MM-dd") + " " + startTime + ":00";
        DateTime time = DateUtil.parse(date);
        // nowTime 小于  time 则 time为将来
        return nowTime.compareTo(time) < 0;
    }

    /**
     * 判断时间是否是当天
     * @param time 时间
     * @return true/false
     */
    public static boolean judeIsTimeToday(Date time){
        Date today = new Date();
        // 今天开始时间
        DateTime todayBeginTime = DateUtil.beginOfDay(today);
        // 今天结束时间
        DateTime todayEndTime = DateUtil.endOfDay(today);
        //如果小于今天的开始日期，则不是今天，否则继续判断
        if (time.compareTo(todayBeginTime) < 0) {
            return false;
        }
        //如果大于今天的结束日期，则不是今天，否则是今天
        return todayEndTime.compareTo(time) >= 0;
    }

    /**
     * 获取一段时间内的周次信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param remindRealTime 提醒时间
     * @return 周次信息列表
     */
    public static List<WeekInfoBo> getWeekInfoList(Date startTime, Date endTime, Date remindRealTime){
        //  创建日程所在周次
        int week;
        WeekInfoBo weekInfoBo;
        List<WeekInfoBo> weekInfoBoList = new ArrayList<>();
        // 循环当开始时间大于结束时间 跳出
        while (startTime.compareTo(endTime) < 0){
            startTime = DateUtil.offsetDay(startTime, 1);
            remindRealTime = DateUtil.offsetDay(remindRealTime, 1);
            week = DateUtil.dayOfWeek(startTime);
            weekInfoBo = new WeekInfoBo(week == 1 ? 7 : week-1 ,startTime,remindRealTime);
            weekInfoBoList.add(weekInfoBo);
        }
        return weekInfoBoList;
    }

    /**
     * 获取一段时间内的月号信息
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param remindRealTime 提醒时间
     * @return 月号信息列表
     */
    public static List<MonthInfoBo> getMonthInfoBoList(Date startTime, Date endTime, Date remindRealTime){
        // 创建日程所在周次
        int monthDay;
        MonthInfoBo monthInfoBo;
        List<MonthInfoBo> monthInfoBoList = new ArrayList<>();
        // 循环当开始时间大于结束时间 跳出
        while (startTime.compareTo(endTime) < 0){
            startTime = DateUtil.offsetDay(startTime, 1);
            remindRealTime = DateUtil.offsetDay(remindRealTime,1);
            monthDay = DateUtil.dayOfMonth(startTime);
            monthInfoBo = new MonthInfoBo(monthDay,startTime,remindRealTime);
            monthInfoBoList.add(monthInfoBo);
        }
        return monthInfoBoList;
    }

    /**
     * 获取真正提醒时间
     * @param scheduleDate 日程日期
     * @param startTime 开始时间
     * @param remindTime 提醒时间，单位分钟
     * @return 提醒日期
     */
    public static Date getRealRemindTime(Date scheduleDate,String startTime,Integer remindTime){
        String scheduleDateStr = DateUtil.format(scheduleDate, "yyyy-MM-dd") + " " + startTime + ":00";
        DateTime realRemindTime = DateUtil.parse(scheduleDateStr);
        DateTime result = DateUtil.offsetMinute(realRemindTime, remindTime * -1);
        // 如果提醒时间和日程日期不是同一天则，返回日程日期的当天00:00
        if (DateUtil.beginOfDay(result).compareTo(DateUtil.beginOfDay(scheduleDate)) != 0 ){
            return DateUtil.beginOfDay(scheduleDate);
        }
        return result;
    }
}
